PostgreSQL是一個開源的框架,關聯式資料庫資管理系統。PostgreSQL 的操作過程相似於 MySQL,不論是建表或是建使用者都滿類似的。MyBatis 算是常用的開源框架,在 Spring boot 中可實現對資料庫訪問。
Maven 中引用
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${VERSION}</version>
</dependency>
@Configuration // 用來設定 Spring 中的環境配置
@MapperScan(basePackages = { DataBaseConfig.PACKAGE }, sqlSessionFactoryRef = "sqlSessionFactory") // 掃描定義的包並使用任何映射器註釋(@Select 、@Delete)並自動選取接口
public class DataBaseConfig {
static final String PACKAGE = "cch.com.example.demo.mapper";
@Value("${db_classname}") // 可以想成是讀取環境變數,並將其賦值給 classname
private String classname;
@Value("${db_url}")
private String url;
@Value("${db_username}")
private String username;
@Value("${db_password}")
private String password;
@Value("${db_maximum_pool_size}")
private String maximumPoolSize;
@Bean(name = "dataSource") // 宣告 Bean 並將其註冊到 Spring 中
@Primary
public DataSource dataSource() {
// 設定 DB 的環境
Properties props = new Properties();
props.setProperty("stringtype", "unspecified");
final HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName(this.classname);
hikariConfig.setJdbcUrl(this.url);
hikariConfig.setDataSourceProperties(props);
hikariConfig.setUsername(this.username);
hikariConfig.setPassword(this.password);
hikariConfig.setMaximumPoolSize(Integer.valueOf(this.maximumPoolSize));
hikariConfig.setConnectionTestQuery("SELECT 1");
hikariConfig.setPoolName("springHikariCP");
return new HikariDataSource(hikariConfig);
}
@Bean(name = "transactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager((dataSource()));
}
// 定義 data source、事務管理或實體之間的映射
@Bean(name = "sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return sessionFactoryBean.getObject();
}
}
以上是 mybatis 對資料庫訪問的配置和定義要被 mybatis 所掃描的 Package。下面簡單的在 PostgreSQL 建表吧,這邊我們透過 sql 語法建立一連串的事件,建立使用者、建立 DB、建立資料表等。
// init.sql
CREATE USER itachi WITH ENCRYPTED PASSWORD '12345678'; // 建立使用者
CREATE DATABASE employee // 建立資料表
WITH
OWNER = itachi
ENCODING = 'UTF8'
TABLESPACE = pg_default
CONNECTION LIMIT = -1;
ALTER USER itachi WITH SUPERUSER; // 讓使用者有 SUPERUSER 權限
grant all privileges on database employee to itachi; // 賦予權限(像是 SELECT、DELETE 等操作)
\c employee // 切換資料庫
DROP TABLE IF EXISTS public.user; // 如果資料表 user 存在就將其刪除
CREATE TABLE IF NOT EXISTS public.user ( // 建立資料表,NOT NULL 表示不能為空
id serial,
name varchar(20) NOT NULL,
age integer,
email varchar(100) NULL,
tel varchar NOT NULL,
primary key (id) // 設定主鍵
);
ALTER TABLE public.user OWNER TO itachi;
透過 docker-compose 進行 PostgreSQL 鍵置
version: '3.7'
services:
postgres:
container_name: postgres
image: postgres
restart: always
ports:
- "5432:5432"
hostname: postgres
environment:
- POSTGRES_PASSWORD=123456
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql // 把上面建立的 SQL 過程掛載置容器中,此容器就會幫我們執行我們定義的過程
- postgresql-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 30s
timeout: 10s
retries: 5
volumes:
postgresql-data:
今天就到這邊,打完疫苗身體非常不舒服